#!/bin/bash

# docker镜像批量打包和导入脚本

# 判断是否安装tar工具
if ! command -v tar &> /dev/null; then
    sudo yum install -y tar &> /dev/null
fi

# 存储目录
output_dir="/data"
mkdir -p "$output_dir"

# 打包镜像
save_image() {
    docker images --format "{{.Repository}} {{.Tag}}" | while read -r line; do
        # 分离出仓库和标签
        repository=$(echo "$line" | awk '{print $1}' | awk -F '/' '{print $NF}')
        tag=$(echo "$line" | awk '{print $2}')

        # 构建完整的镜像名称
        full_image_name="$repository:$tag"

        # 检查镜像是否为 <none>，如果是则跳过
        if [ "$repository" = "<none>" ]; then
            tput bold
            tput setaf 5
            echo "跳过 <none> repository: $tag"
            tput sgr0
            continue
        fi

        # 打包镜像
        tar_file="${output_dir}/${repository}_${tag}.tar"
        docker save -o "$tar_file" "$full_image_name"
        if [ $? -eq 0 ]; then
            tput bold
            tput setaf 2
            echo "$full_image_name 成功保存"
            tput sgr0
        else
            tput bold
            tput setaf 1
            echo "$full_image_name 保存失败"
            tput sgr0
        fi
    done
}

# 导入镜像
load_image() {
    # 指定镜像包所在的目录
    image_dir="$output_dir"
    # 导入所有镜像包
    for image_file in "${image_dir}"/*.tar; do
        if [ -f "$image_file" ]; then
            # 导入镜像
            docker load -i "$image_file"
            if [ $? -eq 0 ]; then
                tput bold
                tput setaf 2
                echo "镜像 $(basename "$image_file" .tar) 成功导入"
                tput sgr0
            else
                tput bold
                tput setaf 1
                echo "镜像 $(basename "$image_file" .tar) 导入失败"
                tput sgr0
            fi
        else
            tput bold
            tput setaf 5
            echo "镜像文件 $image_file 不存在"
            tput sgr0
        fi
    done
}

# 提示用户选择操作，直到输入正确
while true; do
    tput bold
    tput smul
    tput setaf 3
    tput setab 0
    read -p "请选择操作：$(tput setaf 6) 1. 打包镜像 $(tput setaf 4) 2. 导入镜像 $(tput setaf 2) q. 退出：" select
    tput sgr0
    case "$select" in
        1)
            save_image
            break
            ;;
        2)
            load_image
            break
            ;;
        q)
            exit
            ;;
        *)
            tput bold
            tput setaf 5
            tput blink
            echo "输入错误，请输入 1 或 2"
            tput sgr0
            ;;
    esac
done